package org.posupe.areas;

/**
 * @author Claudemir Junior
 * 
 */
public class RepositorioAreasLista {
	private Area area;

	private RepositorioAreasLista proximo;

	private int tamanho;

	public RepositorioAreasLista () {
		this.area = null;
		this.proximo = null;
		this.tamanho = 0;
	}
	
	public void inserir(Area area) {
		if (this.area == null) {
			this.area = area;
			this.proximo = new RepositorioAreasLista();
		} else {
			this.proximo.inserir(area);
		}

		this.tamanho = this.tamanho + 1;
	}

	public void atualizar(Area area) {
		if (this.area != null) {
			if (this.area.getCodigo() == area.getCodigo()) {
				this.area = area;
			} else {
				this.proximo.atualizar(area);
			}
		} else {
			throw new RuntimeException("Area inexistente.");
		}
	}

	public void remover(int codigo) {
		if (this.area != null) {
			if (this.area.getCodigo() == codigo) {
				this.area = this.proximo.area;
				this.proximo = this.proximo.proximo;
			} else {
				this.proximo.remover(codigo);
			}

			this.tamanho = this.tamanho - 1;
		} else {
			throw new RuntimeException("Area inexistente.");
		}
	}

	public Area procurar(int codigo) {
		Area resultado = null;

		if (this.area != null) {
			if (this.area.getCodigo() == codigo) {
				resultado = this.area;
			} else {
				resultado = this.proximo.procurar(codigo);
			}
		} else {
			throw new RuntimeException("Area inexistente.");
		}

		return resultado;
	}

	public boolean existe(int codigo) {
		boolean resultado = false;

		if (this.area != null) {
			if (this.area.getCodigo() == codigo) {
				resultado = true;
			} else {
				resultado = this.proximo.existe(codigo);
			}
		}

		return resultado;
	}

	public RepositorioAreasLista procurar(Area area) {
		RepositorioAreasLista resultado = new RepositorioAreasLista();
		Area[] areas = this.getIterator();

		for (int i = 0; i < areas.length; i++) {
			if (areas[i].match(area)) {
				resultado.inserir(areas[i]);
			}
		}

		return resultado;
	}

	public Area[] getIterator() {
		Area[] resultado = new Area[this.tamanho];
		RepositorioAreasLista proximaArea = null;
		int contador = 0;

		if (resultado.length > 0) {
			resultado[contador] = this.area;
			contador++;
		}

		proximaArea = this.proximo;

		while (contador < resultado.length) {
			resultado[contador] = proximaArea.area;
			proximaArea = proximaArea.proximo;
			contador++;
		}

		return resultado;
	}

	public Area getArea() {
		return area;
	}

	
	public RepositorioAreasLista getProximo() {
		return proximo;
	}

	
	public int getTamanho() {
		return tamanho;
	}

}
